package com.wk.oms.config;

import com.wk.common.constant.mq.ItemExchange;
import com.wk.common.constant.mq.ItemQueue;
import com.wk.common.constant.mq.ItemRoutingKey;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * 设置死信队列
 */
@Configuration
public class RabbitMQConfig {

    /**
     * 延时队列绑定到交换机 routingKey为order.ttl的延时消息先发送到该交换机 再转发到该交换机绑定的队列中
     */
    @Bean
    public Binding delayQueueBinding(){
        return new Binding(ItemQueue.DELAY_QUEUE,       //延时队列
                Binding.DestinationType.QUEUE,
                ItemExchange.ORDER_EXCHANGE,            //延时队列要绑定的交换机
                ItemRoutingKey.ORDER_TTL,               //延时队列接收该路由发送来的消息
                null);
    }

    /**
     * 声明延时队列 存放延时交换机发送的消息 超时后转发消息给 routingKey 为 order.dead 的死信交换机
     */
    @Bean
    public Queue delayQueue(){
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", ItemExchange.ORDER_EXCHANGE);
        arguments.put("x-dead-letter-routing-key", ItemRoutingKey.ORDER_DEAD);      //超时后的消息发送到该路由
        arguments.put("x-message-ttl", 60000);                     //消息延时时间 单位/毫秒
        return new Queue(ItemQueue.DELAY_QUEUE, true, false, false, arguments);
    }

    /**
     * 声明死信交换机 routingKey 为 order.dead 延时队列中的超时消息发送到该交换机 再转发给该交换机绑定的死信队列中
     */
    @Bean
    public Binding deadLetterBinding(){
        return new Binding(ItemQueue.DEAD_LETTER_QUEUE,
                Binding.DestinationType.QUEUE,
                ItemExchange.ORDER_EXCHANGE,
                ItemRoutingKey.ORDER_DEAD,
                null);
    }

    /**
     * 死信队列 消费者监听该队列中的内容并作出对应操作
     */
    @Bean
    public Queue deadLetterQueue(){
        return new Queue(ItemQueue.DEAD_LETTER_QUEUE,
                true,
                false,
                false,
                null);
    }


}
